package com.ruoyi.common.utils.wxpay;

import org.apache.commons.lang3.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * Created by admin on 2017/9/4.
 * 创建订单编号
 * OrderType 订单类型
 */

public class OrderUtil {

//    /**
//     * OrderType 1、搭车订单类型;2、外卖订单类型;3、商城杂货订单类型
//     * **/
//    public static String getOrderNo(String OrderType){
//        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
//        int hashCodeV = UUID.randomUUID().toString().hashCode();
//        if(hashCodeV < 0) {//有可能是负数
//            hashCodeV = - hashCodeV;
//        }
//        return  formatter.format(new Date())+OrderType+String.format("%011d", hashCodeV);
//    }

    /**
     * 获取商城中订单号
     * **/
    public static String getGoodsOrderNo(){
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
        int hashCodeV = UUID.randomUUID().toString().hashCode();
        if(hashCodeV < 0) {//有可能是负数
            hashCodeV = - hashCodeV;
        }
        return  formatter.format(new Date())+String.format("%011d", hashCodeV);
    }

    /***
     * 生成指定长度的随机数
     * **/
    public static String getSecurityCode(int length) {
        // 数字集合  如果需要带字符，则直接添加
        char[] codes = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
        // 获取字符集合的长度
        int n = codes.length;
        // 存放抽出的验证码
        char[] result = new char[length];
        // 不允许重复
        for (int i = 0; i < result.length; i++) {
            int r = (int) (Math.random() * n);
            result[i] = codes[r];
            // 必须确保不会再次抽取到那个字符，因为所有抽取的字符必须不相同。所以把已经选中的字符从codes中去除
            codes[r] = codes[--n];
        }
        return String.valueOf(result);
    }


    /*指定前缀随机生成指定位数的随机数*/
    public static String toCreateRandom(String type,int len) {
        int digit = (int) Math.pow(10, len - 1);
        int rs = new Random().nextInt(digit * 10);
        if (rs < digit) {
            rs += digit;
        }
        return String.valueOf(type+rs);
    }

    /*
     * 生成32位随机字符串
     * */
    public static String getNonceStr() {
        UUID uuid = UUID.randomUUID();
        return uuid.toString().replace("-", "");
    }

    /**
     * 方法用途: 对所有传入参数按照字段名的Unicode码从小到大排序（字典序），并且生成url参数串<br>
     * 实现步骤: <br>
     *
     * @param paraMap    要排序的Map对象
     * @param urlEncode  是否需要URLENCODE
     * @param keyToLower 是否需要将Key转换为全小写
     *                   true:key转化成小写，false:不转化
     * @return
     */
    public static String formatUrlMap(Map<String, String> paraMap, boolean urlEncode, boolean keyToLower) {
        String buff = "";
        Map<String, String> tmpMap = paraMap;
        try {
            List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(tmpMap.entrySet());
            // 对所有传入参数按照字段名的 ASCII 码从小到大排序（字典序）
            Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>() {
                @Override
                public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
                    return (o1.getKey()).toString().compareTo(o2.getKey());
                }
            });
            // 构造URL 键值对的格式
            StringBuilder buf = new StringBuilder();
            for (Map.Entry<String, String> item : infoIds) {
                if (StringUtils.isNotBlank(item.getKey())) {
                    String key = item.getKey();
                    String val = item.getValue();
                    if (urlEncode) {
                        val = URLEncoder.encode(val, "utf-8");
                    }
                    if (keyToLower) {
                        buf.append(key.toLowerCase() + "=" + val);
                    } else {
                        buf.append(key + "=" + val);
                    }
                    buf.append("&");
                }

            }
            buff = buf.toString();
            if (buff.isEmpty() == false) {
                buff = buff.substring(0, buff.length() - 1);
            }
        } catch (Exception e) {
            return null;
        }
        return buff;
    }



    /**
     * 功能描述: 判断值是否为double
     */
    public static boolean isToDouble(Object o){

        try {
            Double.valueOf(o.toString());
            return true;
        }catch (Exception e){
            return false;
        }
    }


    /**
     * @param xml
     * @return Map
     * @description 将xml字符串转换成map
     */
    public static Map<String, String> readStringXmlOut(String xml) {
        Map<String, String> map = new HashMap<String, String>();
        Document doc = null;
        try {
            doc = DocumentHelper.parseText(xml); // 将字符串转为XML
            Element rootElt = doc.getRootElement(); // 获取根节点
            @SuppressWarnings("unchecked")
            List<Element> list = rootElt.elements();// 获取根节点下所有节点
            for (Element element : list) { // 遍历节点
                map.put(element.getName(), element.getText()); // 节点的name为map的key，text为map的value
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }


    public static void main(String[] args) {
        System.out.println(String.valueOf(System.currentTimeMillis()));
    }

}
